import 'package:flutter/widgets.dart';

class SigningUpPageTranslation {
  static final delegate = _SigningUpPageTranslationDelegate();

  static SigningUpPageTranslation of(BuildContext context) {
    return Localizations.of(context, SigningUpPageTranslation);
  }

  late String _languageCode;

  Future<void> load(Locale locale) async {
    _languageCode = locale.languageCode;
  }

  String _resolve(Map<String, String> translations) {
    return translations[_languageCode]!;
  }

  String get title {
    return _resolve(const {
      'ru': 'Регистрация',
      'en': 'Account creation',
    });
  }

  String get emailTextFieldPlaceholder {
    return _resolve(const {
      'ru': 'Электронная почта',
      'en': 'Email',
    });
  }

  String get passwordTextFieldPlaceholder {
    return _resolve(const {
      'ru': 'Пароль',
      'en': 'Password',
    });
  }

  String get emailVerificationCodeTextFieldPlaceholder {
    return _resolve(const {
      'ru': 'Код подтверждения',
      'en': 'Verification code',
    });
  }

  String get nextButtonTitle {
    return _resolve(const {
      'ru': 'Далее',
      'en': 'Next',
    });
  }

  String buildExistingAccountLabelMarkdown({
    required String signingInHref,
  }) {
    return _resolve({
      'ru': 'Уже есть аккаунт? [Войти]($signingInHref)',
      'en': 'Already have an account? [Sign in]($signingInHref)',
    });
  }

  String buildDisclaimerMarkdown({
    required String termsOfUseHref,
    required String privacyPolicyHref,
  }) {
    return _resolve({
      'ru': 'Создавая аккаунт, ты принимаешь наши [условия использования]($termsOfUseHref) и '
          '[политику конфиденциальности]($privacyPolicyHref).',
      'en': 'By creating an account, you agree to our [terms of use]($termsOfUseHref) and '
          '[privacy policy]($privacyPolicyHref).',
    });
  }

  String buildEmailVerificationCodeLabelMarkdown({
    required String email,
  }) {
    return _resolve({
      'ru': 'Мы отправили код подтверждения на\n*$email*',
      'en': 'We have sent a confirmation code to\n*$email*',
    });
  }

  String get verificationCodeTextFieldPlaceholder {
    return _resolve(const {
      'ru': 'Код подтверждения',
      'en': 'Verification code',
    });
  }

  String get emailVerificationCancellationButtonTitle {
    return _resolve(const {
      'ru': 'Отменить',
      'en': 'Cancel',
    });
  }

  String get emailValidationErrorText {
    return _resolve(const {
      'ru': 'Неверный формат электронной почты.',
      'en': 'Email format is invalid.',
    });
  }

  String get wrongLengthPasswordValidationErrorText {
    return _resolve(const {
      'ru': 'Длина пароля должна быть от 8 до 64 символов.',
      'en': 'The password length must be between 8 and 64 characters.',
    });
  }

  String get wrongCharacterPasswordValidationErrorText {
    return _resolve(const {
      'ru': 'В пароле есть недопустимые символы.',
      'en': 'The password contains invalid characters.',
    });
  }

  String get missingRequiredCharacterPasswordValidationErrorText {
    return _resolve(const {
      'ru': 'Пароль должен содержать хотя бы одну букву латинского алфавита.',
      'en': 'The password must contain at least one letter of the Latin alphabet.',
    });
  }

  String get alreadyExistingUserFailureText {
    return _resolve(const {
      'ru': 'Пользователь с такой электронной почтой уже существует.',
      'en': 'A user with this email already exists.',
    });
  }

  String get serverFailureText {
    return _resolve(const {
      'ru': 'Что-то пошло не так. Попробуй ещё раз позже.',
      'en': 'Something went wrong. Try again later.',
    });
  }

  String get networkFailureText {
    return _resolve(const {
      'ru': 'Ошибка соединения. Проверь своё интернет подключение и попробуй ещё раз.',
      'en': 'Connection error. Check your internet connection and try again.',
    });
  }

  String get notFoundEmailVerificationCodeSigningUpFailureText {
    return _resolve(const {
      'ru': 'Код подтверждения не найден.',
      'en': "The verification code wasn't found.",
    });
  }

  String get wrongEmailVerificationCodeSigningUpFailureText {
    return _resolve(const {
      'ru': 'Неправильный код подтверждения.',
      'en': 'The verification code is invalid.',
    });
  }

  String get expiredEmailVerificationCodeSigningUpFailureText {
    return _resolve(const {
      'ru': 'Срок действия кода подтверждения истёк.',
      'en': 'The verification code has expired.',
    });
  }

  String get emailVerificationCodeSubmissionAttemptsOverSigningUpFailureText {
    return _resolve(const {
      'ru': 'Превышено количество попыток отправки кода подтверждения.',
      'en': 'The number of attempts to send the verification code has been exceeded.',
    });
  }
}

class _SigningUpPageTranslationDelegate extends LocalizationsDelegate<SigningUpPageTranslation> {
  @override
  bool isSupported(Locale locale) => const ['ru', 'en'].contains(locale.languageCode);

  @override
  bool shouldReload(LocalizationsDelegate<SigningUpPageTranslation> old) => false;

  @override
  Future<SigningUpPageTranslation> load(Locale locale) async {
    final translation = SigningUpPageTranslation();
    await translation.load(locale);
    return translation;
  }
}
